package com.jungle.client.channel;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

/**
 * 出错重试拦截器
 */
public class RetryInterceptor implements Interceptor {
    private final int maxTries;

    public RetryInterceptor(int maxTries) {
        this.maxTries = maxTries;
    }

    /**
     * 拦截网络请求并尝试重新请求直到成功或达到最大尝试次数
     *
     * @param chain 请求链，用于获取请求和执行请求
     * @return 最终的响应结果，可能是经过多次尝试后的结果
     * @throws IOException 如果请求执行过程中发生网络错误
     */
    @Override
    public Response intercept(Chain chain) throws IOException {
        // 获取当前请求
        Request request = chain.request();

        // 执行当前请求并获取响应
        Response response = chain.proceed(request);

        // 初始化尝试次数为0
        int tryCount = 0;

        // 如果响应不成功且尝试次数未达到最大值，则尝试重新请求
        while (!response.isSuccessful() && tryCount < maxTries) {
            // 关闭当前响应的主体，以释放资源
            if (response.body() != null) {
                response.body().close();
            }

            // 增加尝试次数
            tryCount++;

            // 重新执行请求并获取新的响应
            response = chain.proceed(request);
        }

        // 返回最终的响应结果
        return response;
    }
}
